import proj4 from 'proj4';
import gcoord from 'gcoord';

/**
 * 坐标系转换工具类
 * 提供不同坐标系之间的转换功能，包括CGCS2000、WGS84、GCJ02和BD09坐标系。
 * 
 * @class Transform
 */
class Transform {
    /**
     * 类的单例实例
     * 
     * @static
     * @type {Transform}
     */
    static instance;
    
    /**
     * CGCS2000坐标系投影参数
     * 中央经线117度的横轴墨卡托投影
     * 
     * @type {string}
     */
    projection_cgcs2000 = '+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs';
    
    /**
     * 构造函数
     * 
     * @constructor
     */
    constructor() {
    }

    /**
     * 获取投影工具实例（单例模式）
     * 
     * @static
     * @returns {Transform} 投影工具实例
     */
    static getInstance() {
        if (!Transform.instance) {
            Transform.instance = new Transform();
        }
        return Transform.instance;
    }

    /**
     * 投影转换：CGCS2000 转 WGS84
     * 
     * @param {number} lng - 经度（度）
     * @param {number} lat - 纬度（度）
     * @returns {Array<number>} 转换后的WGS84坐标 [经度, 纬度]
     */
    gcgs2000ToWgs84(lng, lat) {
        return proj4(this.projection_cgcs2000).forward([lng, lat]);
    }

    /**
     * 投影转换：WGS84 转 CGCS2000
     * 
     * @param {number} lng - 经度（度）
     * @param {number} lat - 纬度（度）
     * @returns {Array<number>} 转换后的CGCS2000坐标 [经度, 纬度]
     */
    wgs84ToGcgs2000(lng, lat) {
        return proj4(this.projection_cgcs2000).inverse([lng, lat]);
    }

    /**
     * 投影转换：GCJ02 转 WGS84
     * 从国测局坐标系统转换到国际标准坐标系统
     * 
     * @param {number} lng - 经度（度）
     * @param {number} lat - 纬度（度）
     * @returns {Array<number>} 转换后的WGS84坐标 [经度, 纬度]
     */
    gcj02ToWgs84(lng, lat) {
       var result = gcoord.transform([lng, lat], gcoord.GCJ02, gcoord.WGS84);
        return result;
    }

    /**
     * 投影转换：WGS84 转 GCJ02
     * 从国际标准坐标系统转换到国测局坐标系统
     * 
     * @param {number} lng - 经度（度）
     * @param {number} lat - 纬度（度）
     * @returns {Array<number>} 转换后的GCJ02坐标 [经度, 纬度]
     */
    wgs84ToGcj02(lng, lat) {
       var result = gcoord.transform([lng, lat], gcoord.WGS84, gcoord.GCJ02);
        return result;
    }

    /**
     * 投影转换：BD09 转 WGS84
     * 从百度坐标系转换到国际标准坐标系统
     * 
     * @param {number} lng - 经度（度）
     * @param {number} lat - 纬度（度）
     * @returns {Array<number>} 转换后的WGS84坐标 [经度, 纬度]
     */
    bd09ToWgs84(lng, lat) {
        var result = gcoord.transform([lng, lat], gcoord.BD09, gcoord.WGS84);
        return result;
    }

    /**
     * 投影转换：WGS84 转 BD09
     * 从国际标准坐标系统转换到百度坐标系
     * 
     * @param {number} lng - 经度（度）
     * @param {number} lat - 纬度（度）
     * @returns {Array<number>} 转换后的BD09坐标 [经度, 纬度]
     */
    wgs84ToBd09(lng, lat) {
        var result = gcoord.transform([lng, lat], gcoord.WGS84, gcoord.BD09);
        return result;
    }
}

export default Transform;
